// Copyright 2011, Vanya Davidenko.
// Кодировка файла: UTF-8. 
package info.iu9.red;
import java.util.HashMap;



class DfaStatesCache {
  DfaStatesCache() {
    capacity_ = 1 << 24;  // размер кэша порядка 16 мб (реально больше раза в 2)
    cache_ = new HashMap<DfaCacheKey, DfaCachedState>(capacity_);
    temp_key_ = DfaCacheKey.makeEmpty();
  }

  // Может вернуть null
  DfaCachedState get(final DfaCacheKey k) {
    return cache_.get(k);
  }
  DfaCachedState get(final int[] dense, final int size, final int c) {
    temp_key_.reset(dense, size, c);
    return cache_.get(temp_key_);
  }

  void put(final DfaCacheKey k, final DfaCachedState v) {
    final int current_size = k.sizeInBytes() + v.sizeInBytes();
    if ( size_ + current_size > capacity_ ) {
      clear();
    }
    size_ += current_size;
    cache_.put(k, v);
  }

  void clear() {
    cache_.clear();
    size_ = 0;
  }


  private int size_;
  private final int capacity_;
  private final HashMap<DfaCacheKey, DfaCachedState> cache_;
  private final DfaCacheKey temp_key_;
}
